package sessionbeans;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

import com.sun.org.apache.commons.collections.Factory;

import dtofactory.FactoryDTO;

import entities.CantidadArticulo;
import entities.CantidadMateriaPrima;
import entities.CentroDeDistribucion;
import entities.MateriaPrima;
import entities.PedidoFabricacion;
import entities.PedidoProveedores;
import entities.SolicitudFabricacion;
import entities.Articulo;
import entities.StockMateriaPrima;
import entitiesdto.CantidadArticuloDTO;
import entitiesdto.SolicitudFabricacionDTO;
import facade.SessionFacade;
import facade.SessionFacadeBean;
import sessionbeans.AdminFabricacion;

@Stateless
public class AdminFabricacionBean implements AdminFabricacion {

	@PersistenceContext
	private EntityManager manager;
	private FactoryDTO dtoFactory;

	public AdminFabricacionBean() {
		dtoFactory = FactoryDTO.getInstance();
	}

	public boolean crearSolicitudFabricacion(SolicitudFabricacionDTO solFabr) {
		// PRIMERO GUARDAR LA SOLICITUD DE FABRICACION
		SolicitudFabricacion sol = new SolicitudFabricacion();
		sol = dtoFactory.solFromDTO(solFabr);
		for(CantidadArticulo a : sol.getArticulos()){
			a.setArticulo(manager.find(Articulo.class, a.getArticulo().getRef()));
			manager.persist(a); 
		}
		manager.persist(sol);
		manager.flush();
		// LUEGO, BUSCAR SI YA EXISTE PEDIDO DE FABRICACION PARA ESE ARTICULO,
		// SI EXISTE, SE AGREGA CANTIDAD AL PEDIDO, SI NO EXISTE, SE CREA UN
		// PEDIDO DE FABRICACION

		for (CantidadArticuloDTO art : solFabr.getArticulos()) {
			Articulo arti = manager.find(Articulo.class, art.getArticulo().getRef());
			PedidoFabricacion pf; 
			try{
				pf = (PedidoFabricacion) manager
				.createQuery(
						"select pf from PedidoFabricacion pf where pf.articulo=:arti")
				.setParameter("arti",arti)
				.getSingleResult();	
				pf.setCantidadSolicitada(pf.getCantidadSolicitada()
						+ art.getCantidadPedida());
				manager.merge(pf);

			}catch (NoResultException e) {
				pf = new PedidoFabricacion();
				pf.setArticulo(arti);
				pf.setCantidadFabricada(0);
				pf.setCantidadSolicitada(art.getCantidadPedida());
				manager.persist(pf);
			}
		}
		return true;
	}

	public List<CantidadArticuloDTO> getArticulosSolicitados() {
		List<CantidadArticulo> artsol = manager.createQuery(
				"Select a from CantidadArticulo a").getResultList();
		ArrayList<CantidadArticuloDTO> result = new ArrayList<CantidadArticuloDTO>();
		for (CantidadArticulo as : artsol) {
			CantidadArticuloDTO asDTO = FactoryDTO.getInstance().asolToDTO(as);

			result.add(asDTO);
		}
		return result;
	}

	@Override
	public void comenzarFabricacion() {
//		List<PedidoFabricacion> pedidosFab = manager.createQuery(
//				"Select p from PedidoFabricacion p").getResultList();
//		PedidoProveedores pProv = new PedidoProveedores();
//		for (PedidoFabricacion pf : pedidosFab) {
//			boolean suf = true;
//			int cantidadAFabricar = pf.getCantidadSolicitada()
//					- pf.getCantidadFabricada();
//			int disponiblesFabricar = cantidadAFabricar;
//			for (CantidadMateriaPrima cmp : pf.getArticulo()
//					.getCantidadMateriasPrimas()) {
//
//				StockMateriaPrima smp = (StockMateriaPrima) manager
//						.createQuery(
//								"Select m from StockMateriaPrima m where m.materiaPrima=: mat")
//						.setParameter("mat", cmp.getMateriaPrima())
//						.getSingleResult();// LLAMAR A FACADE?
//				if ((cmp.getCantidad() * cantidadAFabricar) > smp
//						.getCantMateriaPrima().getCantidad()) {
//					CantidadMateriaPrima aPedir = new CantidadMateriaPrima();
//					aPedir.setMateriaPrima(cmp.getMateriaPrima());
//					aPedir.setCantidad((cmp.getCantidad() * cantidadAFabricar)
//							- smp.getCantMateriaPrima().getCantidad());
//					List<CantidadMateriaPrima> materias = pProv
//							.getMateriaPrimaPedida();
//					materias.add(aPedir);
//					pProv.setMateriaPrimaPedida(materias);
//					int posiblesFabricar = (int) (smp.getCantMateriaPrima()
//							.getCantidad() * cmp.getCantidad());
//					if (posiblesFabricar < cantidadAFabricar) {
//						cantidadAFabricar = posiblesFabricar;
//					}
//					suf = false;
//				}
//			}
//			// SI ACA SUF=TRUE quiere decir que tiene la cantidad de materia
//			// prima necesaria
//			if (suf) {
//				// ActualizarStockMateriaPrima FACADE?
//				for (CantidadMateriaPrima cmp : pf.getArticulo()
//						.getCantidadMateriasPrimas()) {
//					StockMateriaPrima m = (StockMateriaPrima) manager
//							.createQuery(
//									"Select m from StockMateriaPrima m where m.materiaPrima=: mat")
//							.setParameter("mat", cmp.getMateriaPrima())
//							.getSingleResult();// ACA VERIFICAR MATERIAS PRIMAS
//					// // ---- CON FACADE?
//
//					// m.setCantidad(m.getCantMateriaPrima().getCantidad()
//					// - (cmp.getCantidad() * cantidadAFabricar));
//					// manager.persist(m);
//
//					// //ACA HAY QUE PONER QUE ESTAN EN PROCESO DE FABRICACION
//				}
//			} else {
//				if (cantidadAFabricar > 0) {
//					for (CantidadMateriaPrima cmp : pf.getArticulo()
//							.getCantidadMateriasPrimas()) {
//						for (CantidadMateriaPrima pedido : pProv
//								.getMateriaPrimaPedida()) {
//							if (pedido.getMateriaPrima() == cmp
//									.getMateriaPrima()) {
//								pedido
//										.setCantidad(pedido.getCantidad()
//												- (cmp.getCantidad() * cantidadAFabricar));
//								StockMateriaPrima smp = (StockMateriaPrima) manager
//										.createQuery(
//												"Select m from StockMateriaPrima m where m.materiaPrima=: mat")
//										.setParameter("mat",
//												cmp.getMateriaPrima())
//										.getSingleResult();// ACA VERIFICAR
//								// MATERIAS PRIMAS
//								// ---- CON FACADE?
//
//								// smp.setCantidad(smp.getCantidad() -
//								// (cmp.getCantidad()*cantidadAFabricar));
//
//								// pedido.setCantidad(pedido.getCantidad() -
//								// smp.getCantidad());
//
//								manager.persist(smp);
//							}
//						}
//					}
//				}
//				manager.persist(pProv);
//			}
//
//		}
	}

}
